

package com.beans;


import com.entidades.Negocios;
import com.entidades.Ofertas;
import com.entidades.Usuarios;
import com.entidades.WsOfertasfull;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Resource;
import javax.el.ELException;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ViewScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.servlet.http.HttpSession;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.Transactional;
import javax.transaction.UserTransaction;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.primefaces.event.FileUploadEvent;  
import org.primefaces.event.SelectEvent;
import org.primefaces.event.SlideEndEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
import org.primefaces.model.UploadedFile;  
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.MapModel;
import org.primefaces.model.map.Marker;

    
/**
 * <p>A simple managed bean to mediate between the user
 * and the persistence layer.</p>
 * @author rlubke
 */
@Named("cOfe")
public class controlOfertas {
    /**
     * <p>The <code>PersistenceContext</code>.</p>
     */
    @PersistenceContext 
    private EntityManager em;
    
    /**
     * <p>The transaction resource.</p>
     */
    @Resource 
    private UserTransaction utx2;

    
    public controlOfertas() {  
    }  
      

    
    //variables de ofertas
    private int cofeNegocio;
    private Date cofeFecalta;
    private Date cofeFecfin;
    private String cofeTitulo;
    private String cofeDescripcion;
    private Double cofePrecio;
    private Integer cofeAhorro;
    private Integer cofeMaxpordia;
    private String cofeTipo;
    private Integer cofePeriodovalidez;

    private String preFechaFin;

    private List<Ofertas> vListaOfertas;
    
    //variablesm buscar ofertas/cupones
    public List<Ofertas> vListaCupones;
    public Ofertas selectedOfe;
    public String orderBy;
    public Double minPrecio;
    public Double maxPrecio;
    public String tipoOferta;

    public Date fechaAhora;

    public Ofertas getSelectedOfe() {
        return selectedOfe;
    }

    public void setSelectedOfe(Ofertas selectedOfe) {
        
        Map sMap;
        sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        controlNegocios cn = (controlNegocios) sMap.get("cNeg");
        
        cn.negocioOferta = cn.findNegocioPorId(selectedOfe.getOfeNegocio());
        
        this.selectedOfe = selectedOfe;
    }

    public String getOrderBy() {
        if(orderBy == null){orderBy = "id_oferta";}
        return orderBy;
    }

    public void setOrderBy(String orderBy) {
        this.orderBy = orderBy;
    }

    public Double getMinPrecio() {
        if(minPrecio == null){ minPrecio = 0.00;}
        System.out.println("GET min precio--> " + minPrecio);
        return minPrecio;
    }

    public void setMinPrecio(Double minPrecio) {
        this.minPrecio = minPrecio;
    }

    public Double getMaxPrecio() {
        if(maxPrecio == null){ maxPrecio = 1000.00;}
        System.out.println("GET max precio--> " + maxPrecio);
        return maxPrecio;
    }

    public void setMaxPrecio(Double maxPrecio) {
        this.maxPrecio = maxPrecio;
    }

    public String getTipoOferta() {
        if(tipoOferta == null){tipoOferta = "";}
        return tipoOferta;
    }

    public void setTipoOferta(String tipoOferta) {
        this.tipoOferta = tipoOferta;
    }

    public List<Ofertas> getvListaCupones() {
        vListaCupones = findOfertas(orderBy, maxPrecio, minPrecio, tipoOferta);
        //vListaCupones = findOfertas(null, 1.00, 1.00, "");
        return vListaCupones;
    }

    public void setvListaCupones(List<Ofertas> vListaCupones) {
        this.vListaCupones = vListaCupones;
    }

    public Date getFechaAhora() {
        fechaAhora = new Date();
        return fechaAhora;
    }

    public void setFechaAhora(Date fechaAhora) {
        this.fechaAhora = fechaAhora;
    }
    
    public String getPreFechaFin() {
        return preFechaFin;
    }

    public void setPreFechaFin(String preFechaFin) {
        this.preFechaFin = preFechaFin;
    }
  
    public int getCofeNegocio() {
        return cofeNegocio;
    }

    public void setCofeNegocio(int cofeNegocio) {
        this.cofeNegocio = cofeNegocio;
    }

    public Date getCofeFecalta() {
        return cofeFecalta;
    }

    public void setCofeFecalta(Date cofeFecalta) {
        this.cofeFecalta = cofeFecalta;
    }

    public Date getCofeFecfin() {
        return cofeFecfin;
    }

    public void setCofeFecfin(Date cofeFecfin) {
        this.cofeFecfin = cofeFecfin;
    }

    public String getCofeTitulo() {
        return cofeTitulo;
    }

    public void setCofeTitulo(String cofeTitulo) {
        this.cofeTitulo = cofeTitulo;
    }

    public String getCofeDescripcion() {
        return cofeDescripcion;
    }

    public void setCofeDescripcion(String cofeDescripcion) {
        this.cofeDescripcion = cofeDescripcion;
    }

    public Double getCofePrecio() {
        return cofePrecio;
    }

    public void setCofePrecio(Double cofePrecio) {
        this.cofePrecio = cofePrecio;
    }

    public Integer getCofeAhorro() {
        return cofeAhorro;
    }

    public void setCofeAhorro(Integer cofeAhorro) {
        this.cofeAhorro = cofeAhorro;
    }

    public Integer getCofeMaxpordia() {
        return cofeMaxpordia;
    }

    public void setCofeMaxpordia(Integer cofeMaxpordia) {
        this.cofeMaxpordia = cofeMaxpordia;
    }

    public String getCofeTipo() {
        return cofeTipo;
    }

    public void setCofeTipo(String cofeTipo) {
        this.cofeTipo = cofeTipo;
    }

    public Integer getCofePeriodovalidez() {
        return cofePeriodovalidez;
    }

    public void setCofePeriodovalidez(Integer cofePeriodovalidez) {
        this.cofePeriodovalidez = cofePeriodovalidez;
    }
    
    public List<Ofertas> getvListaOfertas() {
        vListaOfertas = findAllOfertasNegocio();
        return vListaOfertas;
    }

    public void setvListaOfertas(List<Ofertas> vListaofertas) {
        this.vListaOfertas = vListaofertas;
    }
    
    
    public void createOferta() throws ParseException {
        FacesContext context = FacesContext.getCurrentInstance();
        Map sMap;
        sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
        Ofertas wofe = new Ofertas();

        cofeFecalta = new Date();
        
        Usuarios usr = (Usuarios) sMap.get("user");
        cofeNegocio = usr.getUsuNegocio();

        //SimpleDateFormat formatoDelTexto = new SimpleDateFormat("dd/MM/yy");
        //System.out.println("preFechaFin --> " + preFechaFin);
        //cofeFecfin = formatoDelTexto.parse(preFechaFin);
        
        //cofeFecfin = new Date();
        System.out.println("cofeAhorro --> " + cofeAhorro);
        System.out.println("cofeDescripcion --> " + cofeDescripcion);
        System.out.println("cofeFecalta --> " + cofeFecalta);
        System.out.println("cofeFecfin --> " + cofeFecfin);
        System.out.println("cofeMaxpordia --> " + cofeMaxpordia);
        System.out.println("cofeNegocio --> " + cofeNegocio);
        System.out.println("cofePeriodovalidez --> " + cofePeriodovalidez);
        System.out.println("cofePrecio --> " + cofePrecio);
        System.out.println("cofeTipo --> " + cofeTipo);
        System.out.println("cofeTitulo --> " + cofeTitulo);
        
        wofe.setOfeAhorro(cofeAhorro);
        wofe.setOfeDescripcion(cofeDescripcion);
        wofe.setOfeFecalta(cofeFecalta);
        wofe.setOfeFecfin(cofeFecfin);
        wofe.setOfeMaxpordia(cofeMaxpordia);
        wofe.setOfeNegocio(cofeNegocio);
        wofe.setOfePeriodovalidez(cofePeriodovalidez);
        wofe.setOfePrecio(cofePrecio);
        wofe.setOfeTipo(cofeTipo);
        wofe.setOfeTitulo(cofeTitulo);
        
/*
        wofe.setOfeAhorro(null);
        wofe.setOfeDescripcion(null);
        wofe.setOfeFecalta(null);
        wofe.setOfeFecfin(null);
        wofe.setOfeMaxpordia(null);
        wofe.setOfeNegocio(1);
        wofe.setOfePeriodovalidez(null);
        wofe.setOfePrecio(null);
        wofe.setOfeTipo(null);
        wofe.setOfeTitulo(null);
        */
        
            try {
                utx2.begin();
                em.persist(wofe);
                utx2.commit();
                
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "Oferta dada de alta!", String.class)
                        ,context.getApplication().evaluateExpressionGet(context, "Puedes verla en Ver ofertas.", String.class));
                context.addMessage("creategrowl", message);
                
                //pone la variable de sesion "pagCentro" para que sea la correcta
                controlPrincipal bm = (controlPrincipal) sMap.get("cPri");
                bm.pagCentro = "negocios/verofertas";
                
            } catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException | ELException e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating request!",
                                                        "Unexpected error when creating your request.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new request",
                                                e);
            }     
        }
    
        public void onSlideEnd(SlideEndEvent event){
            
                Integer i = event.getValue();
                cofePrecio = i.doubleValue();
        }
  
        public void handleDateSelect(SelectEvent event) {  
            System.out.println("entra al nuevo evento select date!---> " + cofeFecfin);
        }  
        
        public List<Ofertas> findAllOfertasNegocio() {
            Query query = em.createNamedQuery("Ofertas.findByOfeNegocio");
            Map sMap;
            sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
            Usuarios usr = (Usuarios) sMap.get("user");
            Integer usuNeg = usr.getUsuNegocio();
            Integer paramLike = usuNeg;
            query.setParameter("ofeNegocio", paramLike);
            List<Ofertas> tmpOfertas = query.getResultList();
            return tmpOfertas;
        }
        
        public List<Ofertas> findOfertas(String orderBy, Double maxPrecio, Double minPrecio, String tipo) {
            
            if(orderBy == null || orderBy.isEmpty()){
                orderBy = "id_oferta";
                maxPrecio = 10000.00;
                minPrecio = 0.00;
                tipo = "";
            }
            
            String SQLstring;
            SQLstring = "select * from bdagrupados.ofertas "
                       +" where ofe_precio >= " + minPrecio
                       +" and   ofe_precio <= " + maxPrecio
                       +" and   ofe_tipo like '%" + tipo + "%'"
                       +" order by " + orderBy;
            System.out.println("SQL ejecutada: " + SQLstring);
            Query query = em.createNativeQuery(SQLstring, Ofertas.class);
            //Query query = em.createNamedQuery("Ofertas.findAll");
            List<Ofertas> tmpOfertas = query.getResultList();
            return tmpOfertas;
        }
        
       
        
        public void actuBorrarOferta(Integer idoferta) {
            System.out.println("BORRANDO OFERTA -> ID: " + idoferta);
            FacesContext context = FacesContext.getCurrentInstance();
            try{
                utx2.begin();
                Ofertas s = (Ofertas)
                    em.createNamedQuery("Ofertas.findByIdOferta").
                            setParameter("idOferta", idoferta).getSingleResult();
                    em.remove(s);
                utx2.commit();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO, "Hecho!",  "La oferta ha sido eliminada.");  
                FacesContext.getCurrentInstance().addMessage(null, message);
                
            } catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException e) {
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                            "Error inesperado borrando oferta!",
                                                            "Por favor contacta con el Administrador del sistema.");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Error inesperado borrando oferta",
                                                e);
            }
        }
        
        public boolean ofertaCaducada(Date fechaFin){
            
            Date fAhora = new Date();
      return true;
        }
        
    }
